home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / MacPerl 506 appl folder.sit / MacPerl 506 appl folder / Mac_Perl_506r1m_appl / eg / muck < prev    next >
Text File  |  1994-12-26  |  3KB  |  142 lines

  1. #!../perl
  2.  
  3. $M = '-M';
  4. $M = '-m' if -d '/usr/uts' && -f '/etc/master';
  5.  
  6. do 'getopt.pl';
  7. do Getopt('f');
  8.  
  9. if ($opt_f) {
  10.     $makefile = $opt_f;
  11. }
  12. elsif (-f 'makefile') {
  13.     $makefile = 'makefile';
  14. }
  15. elsif (-f 'Makefile') {
  16.     $makefile = 'Makefile';
  17. }
  18. else {
  19.     die "No makefile¥n";
  20. }
  21.  
  22. $MF = 'mf00';
  23.  
  24. while(($key,$val) = each(ENV)) {
  25.     $mac{$key} = $val;
  26. }
  27.  
  28. do scan($makefile);
  29.  
  30. $co = $action{'.c.o'};
  31. $co = ' ' unless $co;
  32.  
  33. $missing = "Missing dependencies:¥n";
  34. foreach $key (sort keys(o)) {
  35.     if ($oc{$key}) {
  36.     $src = $oc{$key};
  37.     $action = $action{$key};
  38.     }
  39.     else {
  40.     $action = '';
  41.     }
  42.     if (!$action) {
  43.     if ($co && ($c = $key) =~ s/¥.o$/.c/ && -f $c) {
  44.         $src = $c;
  45.         $action = $co;
  46.     }
  47.     else {
  48.         print "No source found for $key $c¥n";
  49.         next;
  50.     }
  51.     }
  52.     $I = '';
  53.     $D = '';
  54.     $I .= $1 while $action =~ s/(-I¥S+¥s*)//;
  55.     $D .= $1 . ' ' while $action =~ s/(-D¥w+)//;
  56.     if ($opt_v) {
  57.     $cmd = "Checking $key: cc $M $D $I $src";
  58.     $cmd =~ s/¥s¥s+/ /g;
  59.     print stderr $cmd,"¥n";
  60.     }
  61.     open(CPP,"cc $M $D $I $src|") || die "Can't run C preprocessor: $!";
  62.     while (<CPP>) {
  63.     ($name,$dep) = split;
  64.     $dep =~ s|^¥./||;
  65.     (print $missing,"$key: $dep¥n"),($missing='')
  66.         unless ($dep{"$key: $dep"} += 2) > 2;
  67.     }
  68. }
  69.  
  70. $extra = "¥nExtraneous dependencies:¥n";
  71. foreach $key (sort keys(dep)) {
  72.     if ($key =~ /¥.o: .*¥.h$/ && $dep{$key} == 1) {
  73.     print $extra,$key,"¥n";
  74.     $extra = '';
  75.     }
  76. }
  77.  
  78. sub scan {
  79.     local($makefile) = @_;
  80.     local($MF) = $MF;
  81.     print stderr "Analyzing $makefile.¥n" if $opt_v;
  82.     $MF++;
  83.     open($MF,$makefile) || die "Can't open $makefile: $!";
  84.     while (<$MF>) {
  85.     chop;
  86.     chop($_ = $_ . <$MF>) while s/¥¥$//;
  87.     next if /^#/;
  88.     next if /^$/;
  89.     s/¥$¥((¥w+):([^=)]*)=([^)]*)¥)/do subst("$1","$2","$3")/eg;
  90.     s/¥$¥((¥w+)¥)/$mac{$1}/eg;
  91.     $mac{$1} = $2, next if /^(¥w+)¥s*=¥s*(.*)/;
  92.     if (/^include¥s+(.*)/) {
  93.         do scan($1);
  94.         print stderr "Continuing $makefile.¥n" if $opt_v;
  95.         next;
  96.     }
  97.     if (/^([^:]+):¥s*(.*)/) {
  98.         $left = $1;
  99.         $right = $2;
  100.         if ($right =~ /^([^;]*);(.*)/) {
  101.         $right = $1;
  102.         $action = $2;
  103.         }
  104.         else {
  105.         $action = '';
  106.         }
  107.         while (<$MF>) {
  108.         last unless /^¥t/;
  109.         chop;
  110.         chop($_ = $_ . <$MF>) while s/¥¥$//;
  111.         next if /^#/;
  112.         last if /^$/;
  113.         s/¥$¥((¥w+):([^=)]*)=([^)]*)¥)/do subst("$1","$2","$3")/eg;
  114.         s/¥$¥((¥w+)¥)/$mac{$1}/eg;
  115.         $action .= $_;
  116.         }
  117.         foreach $targ (split(' ',$left)) {
  118.         $targ =~ s|^¥./||;
  119.         foreach $src (split(' ',$right)) {
  120.             $src =~ s|^¥./||;
  121.             $deplist{$targ} .= ' ' . $src;
  122.             $dep{"$targ: $src"} = 1;
  123.             $o{$src} = 1 if $src =~ /¥.o$/;
  124.             $oc{$targ} = $src if $targ =~ /¥.o$/ && $src =~ /¥.[yc]$/;
  125.         }
  126.         $action{$targ} .= $action;
  127.         }
  128.         redo if $_;
  129.     }
  130.     }
  131.     close($MF);
  132. }
  133.  
  134. sub subst {
  135.     local($foo,$from,$to) = @_;
  136.     $foo = $mac{$foo};
  137.     $from =~ s/¥./[.]/;
  138.     y/a/a/;
  139.     $foo =~ s/¥b$from¥b/$to/g;
  140.     $foo;
  141. }
  142.